package service

import (
	"blog/internal/model"
	"blog/internal/repository"
	"context"
	"errors"
	"fmt"
)

type TagService interface {
	GetTagsByIDs(ctx context.Context, ids []uint) ([]model.Tag, error)
	DeleteTagByID(ctx context.Context, id uint) error
	CreateTag(ctx context.Context, tag *model.Tag) error
	GetAllTags(ctx context.Context) ([]*model.Tag, error)
	UpdateTag(ctx context.Context, id uint, newName string) error
}

func NewTagService(
	service *Service,
	tagRepository repository.TagRepository,
	relationRepository repository.ArticleTagRelationRepository,
) TagService {
	return &tagService{
		Service:      service,
		tagRepo:      tagRepository,
		relationRepo: relationRepository,
	}
}

type tagService struct {
	*Service
	tagRepo      repository.TagRepository
	relationRepo repository.ArticleTagRelationRepository
}

func (s *tagService) GetTagsByIDs(ctx context.Context, ids []uint) ([]model.Tag, error) {
	tagsPtr, err := s.tagRepo.GetTagsByIDs(ctx, ids)
	if err != nil {
		return nil, err
	}
	tags := make([]model.Tag, len(tagsPtr))
	for i, t := range tagsPtr {
		tags[i] = *t
	}
	return tags, nil
}

func (s *tagService) DeleteTagByID(ctx context.Context, id uint) error {
	var articleIDs []uint
	err := s.relationRepo.GetArticleIDsByTagID(ctx, id, &articleIDs)
	if err != nil {
		return err
	}
	if len(articleIDs) > 0 {
		return errors.New("该标签仍关联文章，无法删除")
	}
	return s.tagRepo.DeleteTagByID(ctx, id)
}

func (s *tagService) CreateTag(ctx context.Context, tag *model.Tag) error {
	return s.tagRepo.CreateTag(ctx, tag)
}

func (s *tagService) GetAllTags(ctx context.Context) ([]*model.Tag, error) {
	return s.tagRepo.ListTags(ctx)
}

func (s *tagService) UpdateTag(ctx context.Context, id uint, newName string) error {
	tag, err := s.tagRepo.GetTagByID(ctx, id)
	if err != nil {
		return err
	}
	if tag == nil {
		return errors.New("标签不存在")
	}
	fmt.Println(">>>>>>>>>>>>")
	fmt.Println(newName)

	tag.Name = newName
	return s.tagRepo.Update(ctx, tag)
}
